/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.viajaconmigo.service.impl;

import com.viajaconmigo.error.ViajesException;
import com.viajaconmigo.model.Pais;
import com.viajaconmigo.model.PlanEco;
import com.viajaconmigo.model.PlanOcio;
import com.viajaconmigo.model.Propuesta;
import com.viajaconmigo.model.Solicitud;
import com.viajaconmigo.model.Usuario;
import com.viajaconmigo.model.dto.ParDeFechas;
import com.viajaconmigo.repository.PaisDAO;

import com.viajaconmigo.repository.PlanEcoDAO;

import com.viajaconmigo.repository.PlanOcioDAO;

import com.viajaconmigo.repository.PropuestaDAO;
import com.viajaconmigo.repository.PropuestaDestinoDAO;
import com.viajaconmigo.repository.PropuestaEditorDAO;
import com.viajaconmigo.repository.PropuestaFechaDAO;
import com.viajaconmigo.repository.SolicitudDAO;
import com.viajaconmigo.repository.UsuarioDAO;
import com.viajaconmigo.service.PropuestaService;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.faces.model.SelectItem;
import javax.inject.Inject;
import javax.inject.Named;
import org.springframework.transaction.annotation.Transactional;

/**
 *
 * @author Pablo
 */
@Named
@Transactional(rollbackFor = ViajesException.class)
public class PropuestaServiceImpl implements PropuestaService {

    @Inject
    PaisDAO paisDAO;

    @Inject
    PlanEcoDAO planEcoDAO;

    @Inject
    PlanOcioDAO planOcioDAO;

    @Inject
    PropuestaDAO propuestaDAO;

    @Inject
    SolicitudDAO solicitudDAO;

    @Inject
    UsuarioDAO usuarioDAO;

    @Inject
    PropuestaDestinoDAO propuestaDestinosDAO;

    @Inject
    PropuestaFechaDAO propuestaFechasDAO;

    @Inject
    PropuestaEditorDAO propuestaEditoresDAO;

    @Override
    @Transactional(readOnly = true)
    public List<Propuesta> buscaPropuesta(Integer paisDestino, Date fechaIni,
            Date fechaFin, Short nDiasMax, Short nDiasMin, Integer planEco,
            Integer planOcio) {
        Pais entityPais = null;
        if (paisDestino != null) {
            entityPais = paisDAO.buscarPorId(paisDestino);
        }
        PlanEco entityPlanEco = null;
        if (planEco != null) {
            entityPlanEco = planEcoDAO.buscarPorId(planEco);
        }
        PlanOcio entityPlanOcio = null;
        if (planOcio != null) {
            entityPlanOcio = planOcioDAO.buscarPorId(planOcio);
        }
        ArrayList<Propuesta> propuestas = propuestaDAO.findPropuesta(entityPais,
                fechaIni, fechaFin, nDiasMax, nDiasMin, entityPlanEco, entityPlanOcio);
        return propuestas;
    }

    @Override
    @Transactional(readOnly = true)
    public Propuesta getPropuesta(Integer idPropuesta) {
        return propuestaDAO.buscarPorId(idPropuesta);
    }

    @Override
    @Transactional(readOnly = true)
    public Solicitud getSolicitudByNick(Usuario nick, Propuesta idPropuesta) {
        return solicitudDAO.getSolicitudByNickYIdProp(nick, idPropuesta);
    }

    @Override
    public Solicitud newSolicitud(Usuario nick, Propuesta propuesta, String mensaje) {
        Solicitud solicitud = new Solicitud();
        solicitud.setNick(nick);
        solicitud.setPropuesta(propuesta);
        solicitud.setMensajeSolicitud(mensaje);
        solicitud.setFechaSolicitud(Calendar.getInstance().getTime());
        return solicitudDAO.crear(solicitud);
    }

    /*@Override
     @Transactional(readOnly = true)
     public String getPlanEcoDescr(int idPlanEco, String idioma) {
     String descripcion = null;
     PlanEco planEco = planEcoDAO.buscarPorId(idPlanEco);
     PlanEcoTrad pet = planEcoTradDAO.getPlanEcoTrad(planEco, idioma);
     if (pet != null) {
     descripcion = pet.getDescripcion();
     }
     return descripcion;
     }

     @Override
     @Transactional(readOnly = true)
     public String getPlanEcoNombre(int idPlanEco, String idioma) {
     String nombre = null;
     PlanEco planEco = planEcoDAO.buscarPorId(idPlanEco);
     PlanEcoTrad pet = planEcoTradDAO.getPlanEcoTrad(planEco, idioma);
     if (pet != null) {
     nombre = pet.getDescripcion();
     }
     return nombre;
     }*/
   
    @Override
    @Transactional(readOnly = true)
    public Pais getPais(Integer idPais) {
        return paisDAO.buscarPorId(idPais);
    }

    @Override
    //Insertar nueva propuesta en la base de datos
    public void insertProposal(Usuario nick, ArrayList<SelectItem> destinos,
            ArrayList<ParDeFechas> fechas, Double costeMax, Double costeMin,
            Short nDiasMax, Short nDiasMin, Integer planEco,
            Integer planOcio, String comentario, Boolean publica) {
        Propuesta propuesta = new Propuesta();
        propuesta.setCosteMax(costeMax);
        propuesta.setCosteMin(costeMin);
        propuesta.setDiasMax(nDiasMax);
        propuesta.setDiasMin(nDiasMin);
        if (planEco != null) {
            propuesta.setPlanEco(planEcoDAO.buscarPorId(planEco));
        }
        if (planOcio != null) {
            propuesta.setPlanOcio(planOcioDAO.buscarPorId(planOcio));
        }
        if (comentario.equals("")) {
            propuesta.setResumen("-");
        } else {
            propuesta.setResumen(comentario);
        }
        propuesta.setPublica(publica);
        propuesta.setFechaCreacion(Calendar.getInstance().getTime());
        propuesta.setFechaActualiza(Calendar.getInstance().getTime());
        propuesta.setNick(nick);

        // A ver qué hacemos con estas dos ----------------------------------
        propuesta.setFechaCaduca(Calendar.getInstance().getTime());
        //propuesta.setInvitacionesList(null);
        Propuesta propInsertada = propuestaDAO.crear(propuesta);
        for (int i = 0; i < destinos.size(); i++) {
            propuestaDestinosDAO.crearPropuestaDestino(propInsertada,
                    paisDAO.buscarPorId((Integer) destinos.get(i).getValue()));
        }
        for (int i = 0; i < fechas.size(); i++) {
            propuestaFechasDAO.crearPropuestaFechas(fechas.get(i).getFechaIni(),
                    fechas.get(i).getFechaFin(), propInsertada);
        }
        propuestaEditoresDAO.crearPropuestaEditor(nick, propInsertada, true,
                Calendar.getInstance().getTime());
    }

    @Override
    public List<Propuesta> obtenerPropuestasPorMi(Usuario nick) {
        List<Propuesta> propuestas = propuestaDAO.obtenerPropuestasPorMi(nick);
        return propuestas;
    }
    
    @Override
    public List<Propuesta> obtenerPropuestasPorOtros(Usuario nick){
        List<Propuesta> propuestas = propuestaDAO.obtenerPropuestasPorOtros(nick);
        return propuestas;
    }
    
    @Override
    public List<Propuesta> obtenerPropuestasPasadas(Usuario nick){
        List<Propuesta> propuestas = propuestaDAO.obtenerPropuestasPasadas(nick);
        return propuestas;
    }

}
